const { body, param, query } = require('express-validator')
const validate = require('../middleware/validate')
const mongoose = require('mongoose')
const Category = require('../models/Category')
const Article = require('../models/Article')
const User = require('../models/User')
// 添加文章
exports.addArticle = validate([
  body('title').notEmpty().withMessage('文章标题不能为空'),
  body('content').notEmpty().withMessage('文章内容不能为空'),
  body('category').notEmpty().withMessage('文章分类不能为空'),
  body('category').custom(async (value) => {
    if (!mongoose.Types.ObjectId.isValid(value)) {
      return Promise.reject('分类ID错误')
    } else {
      // 查询是否有这个分类
      const user = await Category.findById(value)
      if (!user) {
        return Promise.reject('分类不存在')
      }
      return true
    }
  }),
])
// 获取文章
exports.getArticle = validate([
  param('id').notEmpty().withMessage('文章ID不能为空'),
  param('id').isMongoId().withMessage('文章ID格式不正确'),
  param('id').custom(async (id, { req }) => {
    const article = await Article.findById(id).populate('author')
    if (!article) {
      return Promise.reject('文章不存在')
    }
    return true
  }),
])
// 修改文章
exports.modifyArticle = validate([
  param('id').notEmpty().withMessage('文章ID不能为空'),
  param('id').isMongoId().withMessage('文章ID格式不正确'),
  param('id').custom(async (id, { req }) => {
    const article = await Article.findById(id).populate('author')
    if (!article) {
      return Promise.reject('文章不存在')
    }
    if (article.author._id.toString() !== req._id.toString()) {
      return Promise.reject('你没有权限修改该文章')
    }
    return true
  }),
  body('title').notEmpty().withMessage('文章标题不能为空'),
  body('content').notEmpty().withMessage('文章内容不能为空'),
  body('category').notEmpty().withMessage('文章分类不能为空'),
  body('is_draft').optional().isBoolean().withMessage('是否为草稿格式不正确'),
  body('category').custom(async (value) => {
    console.log('value!!: ', value)
    if (!mongoose.Types.ObjectId.isValid(value)) {
      return Promise.reject('分类ID错误')
    } else {
      // 查询是否有这个分类
      const category = await Category.findById(value)
      if (!category) {
        return Promise.reject('分类不存在')
      }
      return true
    }
  }),
])
// 删除文章
exports.deleteArticle = validate([
  param('id').notEmpty().withMessage('文章ID不能为空'),
  param('id').isMongoId().withMessage('文章ID格式不正确'),
  param('id').custom(async (id, { req }) => {
    const article = await Article.findById(id).populate('author')
    if (!article) {
      return Promise.reject('文章不存在')
    }
    const user = await User.findById(req._id)
    if (!user.roles.includes('admin') && article.author._id.toString() !== req._id.toString()) {
      return Promise.reject('你没有权限删除该文章')
    }
    return true
  }),
])
